from typing import override
from rest_framework.serializers import ModelSerializer
from rest_framework import serializers
from product.models import Product,Review

# 先序列化评论
class ReviewModelSerializer(ModelSerializer):  
    class Meta:
        # 指定要序列化的模型
        model = Review
        # 指定要序列化的字段
        fields = ["id", "comment", "username"]


# 通用序列化器
class ProductModelSerializer(ModelSerializer):  # 序列化器的作用：把模型对象转换为字典列表
    # 关联的评论模型序列化器，原因：查询外键关联的字段，需要关联的模型序列化器
    # 有的字段只能读取，不能写入，所以需要指定read_only=True，只读/只写属性
    review_set = ReviewModelSerializer(many=True,read_only=True) 
    # review_set = serializers.PrimaryKeyRelatedField(many=True, read_only=True)
    add_stock = serializers.SerializerMethodField() 
    
    class Meta:
        # 指定要序列化的模型
        model = Product  
        # 指定要序列化的字段
        # fields = '__all__'  # 所有的字段  
        fields = ['id', 'product_name', 'cover', 'price', 'stock', 'is_active','review_set','add_stock']
      
        # 排除指定序列化字段
        # exclude = ['product_name']
        
        # 添加额外参数
        extra_kwargs = {
            'price': {  
                'min_value': 0,  # 最小价格为0
                'required': True,  # 价格是必填的
                # 'write_only':True,
                # 自定义错误信息
                'error_messages': {  # 错误信息
                    'min_value': '价格不能小于0',  # 价格不能小于0的错误信息
                    'required': '价格是必填的',  # 价格是必填的错误信息
                }
            },
            'stock': {  
                'min_value': 0,  # 最小库存为0
                'required': True,  # 必填
                # 'read_only':True,
                # 自定义错误信息
                'error_messages': {  # 错误信息
                    'min_value': '库存不能小于0',  # 价格不能小于0的错误信息
                    'required': '库存是必填的',  # 价格是必填的错误信息
                }
            }
        }
    # 自定义字段，用于添加库存
    def get_add_stock(self,obj):  # obj是当前的模型对象
        return obj.add_stock()  # 从当前的模型对象中导入自定义的方法，调用这个方法，返回结果
    
    # def validate_product_name(self,value):  # value是当前的字段值
    #     if Product.objects.filter(product_name=value).exists():  # 过滤出商品名称相同的商品
    #         raise serializers.ValidationError('商品名称不能重复')  # 抛出异常，商品名称已经存在
        
    def validate_price(self,value):
        if value < 0.1:
            # ValidationError是DRF提供的一个异常类，用于验证失败时抛出异常
            raise serializers.ValidationError('价格不能小于0.1')
        return value
    
    def validate(self,attrs):  # attrs是当前的所有字段值
        price = attrs.get('price')  # 获取价格字段的值
        stock = attrs.get('stock')  # 获取库存字段的值
        if price is not None and stock is not None and price * stock > 10000:
            raise serializers.ValidationError('价格和库存的乘积不能超过10000')              
        return super().validate(attrs)  # 调用父类的validate方法，验证所有字段值
        
        












# -------------------------------------------------------------------
# def product_serializer(data):
#         # 列表的序列化
#         data_list = []  # 用于存储商品的列表
#         # 将商品数据转换为字典列表:序列化 通过json与前端交互数据        
#         for product in data:
#             data_list.append({
#                  "name":product.product_name,  # 商品名称
#                 "cover":f"http://127.0.0.1:8000{product.cover.url}" if product.cover else None, 
#                 "price":product.price, 
#                 "popularity":product.popularity, 
#                 "stock":product.stock,  # 商品库存
#                 "is_active":product.is_active,  # 商品状态                
#             })
            
#         # 详情
        
        
#         # 反序列化
        
#         return data_list
            
    